// 位运算
// 位运算最关键的几个操作：
// 1.取最右边的 ‘1’：num &= (-num)
// 2.消除最右边的 ‘1‘：num &= (num - 1)
// 3.异或运算 ^：相同为 0（消消乐），不同为 1，无进位相加
// 4.位图的思想：如果题目中提出要求不适用额外的数据结构，那么大概率是要使用位图了
// 5.检查某一个 bit：(num >> x) & 1 == 1
// 6.设置某一个 bit：num |= (1 << x);

// 例题 3：
// 给你两个整数 a 和 b ，不使用 运算符 + 和 -，计算并返回两整数之和。
//
//        示例 1：
//
//        输入：a = 1, b = 2
//        输出：3
//        示例 2：
//
//        输入：a = 2, b = 3
//        输出：5
//
//
//        提示：
//
//        -1000 <= a, b <= 1000

// 解题思路：
// 本题算加减法，要求不能用加减法，那就只能用位运算
// 位运算采用 异或运算，即 无进位相加，进位采用按位与，再左移
// 无进位相加的结果 再异或 进位
// 重复上述步骤，直到进位为 0

public class GetSum {
    public int getSum(int a, int b) {
        // 异或 - 无进位相加
        // 按位与 - 进位
        while(b != 0){
            int tmp = a ^ b;
            b = (a & b) << 1;
            a = tmp;
        }
        return a;
    }
}
